package vues;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Observable;
import java.util.Observer;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import modele.ModeleP;
import controleurs.BDExitControler;
import controleurs.DescriptifBD;
import controleurs.MyMenuListener;
import de.javasoft.plaf.synthetica.SyntheticaClassyLookAndFeel;
import de.javasoft.plaf.synthetica.SyntheticaStandardLookAndFeel;

/**
 * VM Arguments : -splash:msc/splash_screen
 * Fenetre principale du programme, associant tous les panneaux des diff�rentes fen�tres.
 * @author : Coudeville
 */
public class MainFrame implements Observer{
	JPanel pResume;
	public JFrame f;
	public JFileChooser fc;
	private ScreenPane img;
	private JPanel resume;
	private JLabel editeur;
	private JLabel annee;
	private JLabel genre;
	private JLabel dessinateur;
	private JLabel auteur;
	private JLabel titre;
	private JTextArea descript;
	private ModeleP mod;
	private Dimension minDim=new Dimension(50,23);
	boolean lnfChanged=false;
	/**
	 * Contructeur de la fenetre.
	 * @param pMainPane Le panneau principale comprenant les recherches et le listage des resultats.
	 * @param myModele Le modele principale.
	 */
	public MainFrame(MainPanel pMainPane, ModeleP myModele){
		this.mod=myModele;
		this.setLNF(1);
		myModele.addObserver(this);
		f=new JFrame("BDtheque - Classement de vos bandes dessinees preferees");
		f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		//Action à la fermeture
		f.addWindowListener(new BDExitControler(this, myModele));
		f.setPreferredSize(java.awt.Toolkit.getDefaultToolkit().getScreenSize());
		//Ajout du Menu
		f.setJMenuBar(this.createMenu(myModele));
		//Positionnement partie recherche + resultat
		//Ajout du descriptif;
		pResume=new JPanel();
		pResume.setOpaque(false);
		pResume.add(createBDResume());
		pMainPane.setPreferredSize(f.getPreferredSize());
		JSplitPane sliderResume=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pMainPane, pResume);
		sliderResume.setPreferredSize(java.awt.Toolkit.getDefaultToolkit().getScreenSize());
		f.getContentPane().add(sliderResume, BorderLayout.CENTER);
		sliderResume.setDividerLocation(1000);
		//Packaging des composants, affichage de la fenetre
		f.pack();
		f.setVisible(true);
	}
	/**
	 * Creation du Menu de la fenetre, avec les fonctions d'edition, de modification et de sauvegarde, en plus des options de changement de Look'n'Feel.
	 * @param myModele Le modele principale.
	 * @return Le menu de la fenetre
	 */
	public JMenuBar createMenu(ModeleP myModele){
		JMenuBar menu=new JMenuBar();
		MyMenuListener ecouteMenu=new MyMenuListener(myModele, this);
		JMenu m1=new JMenu("Fichier");
		JMenu m2=new JMenu("Edition BD");
		JMenu m3=new JMenu("Preference");
		JMenu m4=new JMenu("Aide");
		//Choix Fichier :
		fc=new JFileChooser();
		JMenuItem m1Item1=new JMenuItem("Nouvelle Bibliotheque");
		m1Item1.setActionCommand("file:0");
		JMenuItem m1Item2=new JMenuItem("Ouvrir une bibliotheque...");
		m1Item2.setActionCommand("file:1");
		JMenuItem m1Item3=new JMenuItem("Enregistrer");
		m1Item3.setActionCommand("file:2");
		JMenuItem m1Item4=new JMenuItem("Enregistrer sous...");
		m1Item4.setActionCommand("file:3");
		JMenuItem m1Item7=new JMenuItem("Quitter la bibliotheque");
		//Choix Edition :
		JMenuItem m2Item1=new JMenuItem("Ajouter");
		m2Item1.setActionCommand("alb:0");
		JMenuItem m2Item2=new JMenuItem("Modifier");
		m2Item2.setActionCommand("alb:1");
		JMenuItem m2Item3=new JMenuItem("Supprimer");
		m2Item3.setActionCommand("alb:2");
		//Choix Preference :
		JMenu m3_2=new JMenu("Themes");
		ButtonGroup bg=new ButtonGroup();
		JRadioButtonMenuItem m3Item3=new JRadioButtonMenuItem("Synthetica");
		m3Item3.setActionCommand("lnf:0");
		JRadioButtonMenuItem m3Item4=new JRadioButtonMenuItem("Synthetica Classy");
		m3Item4.setActionCommand("lnf:1");
		m3Item4.setSelected(true);
		bg.add(m3Item3);
		bg.add(m3Item4);
		//Choix Aide :
		JMenuItem m4Item1=new JMenuItem("Consulter la Javadoc");
		JMenuItem m4Item2=new JMenuItem("A Propos...");
		m4Item2.setActionCommand("aid:1");
		//Attribution des Controleurs
		m1Item1.addActionListener(ecouteMenu);
		m1Item2.addActionListener(ecouteMenu);
		m1Item3.addActionListener(ecouteMenu);
		m1Item4.addActionListener(ecouteMenu);
		m1Item7.addActionListener(DescriptifBD.quitter());
		m2Item1.addActionListener(ecouteMenu);
		m2Item2.addActionListener(ecouteMenu);
		m3Item3.addActionListener(ecouteMenu);
		m3Item4.addActionListener(ecouteMenu);
		m4Item2.addActionListener(ecouteMenu);
		//Fichier
		m1.add(m1Item1);
		m1.add(m1Item2);
		m1.add(m1Item3);
		m1.add(m1Item4);
		m1.add(m1Item7);
		//Edition
		m2.add(m2Item1);
		m2.add(m2Item2);
		m2.add(m2Item3);
		//Preferences
		m3_2.add(m3Item3);
		m3_2.add(m3Item4);
		m3.add(m3_2);
		//Aide
		m4.add(m4Item1);
		m4.add(m4Item2);
		//Ajout des onglets au Menu
		menu.add(m1);
		menu.add(m2);
		menu.add(m3);
		menu.add(m4);
		return menu;
	}
	/**
	 * Permet de creer le panneau de vue rapide des Albums, situe sur la droite de la fenetre, avec affichage des champs principaux,
	 * Mais aussi des commentaires laisses par les usages et les notes.
	 * @return Le Descriptif de l'album selectionne.
	 */
	public JPanel createBDResume(){
		DescriptifBD ButtonControler=new DescriptifBD(mod);
		//Creation de la navigation Descriptif 
		resume=new JPanel();
		resume.setOpaque(false);
		resume.setBackground(Color.white);
		//Gestion resume [A MODIFIER POUR INTEGRATION DES DONNEES]
		resume.setLayout(new GridBagLayout());
		GridBagConstraints gbc=new GridBagConstraints();
		gbc.gridx=0;
		gbc.gridy=0;
		gbc.insets=new Insets(2, 1, 2, 1);
		gbc.gridheight=1;
		gbc.gridwidth=GridBagConstraints.RELATIVE;
		gbc.anchor=GridBagConstraints.LINE_START;
		gbc.gridy=2;
		resume.add(new JLabel("Titre : "), gbc);
		gbc.gridy=3;
		resume.add(new JLabel("Auteur(s) : "), gbc);
		gbc.gridy=4;
		resume.add(new JLabel("Dessinateur(s) : "), gbc);
		gbc.gridy=5;
		resume.add(new JLabel("Annee : "), gbc);
		gbc.gridy=6;
		resume.add(new JLabel("Genre : "), gbc);
		gbc.gridy=7;
		resume.add(new JLabel("Editeur : "), gbc);
		gbc.gridy=8;
		resume.add(new JLabel("Resume : "), gbc);
		
		//---------------------------------------
		img=new ScreenPane(mod);
		editeur=new JLabel(" ");
		annee=new JLabel(" ");
		annee.setMinimumSize(minDim);
		genre=new JLabel(" ");
		genre.setMinimumSize(minDim);
		dessinateur=new JLabel(" ");
		dessinateur.setMinimumSize(minDim);
		auteur=new JLabel(" ");
		auteur.setMinimumSize(minDim);
		titre=new JLabel(" ");
		titre.setMinimumSize(minDim);
		descript=new JTextArea(" ");
		descript.setLineWrap(true);
		descript.setOpaque(false);
		descript.setEditable(false);
		descript.setMinimumSize(minDim);
		//---------------------
		gbc.anchor=GridBagConstraints.CENTER;
		gbc.gridx=0;
		gbc.gridy=0;
		gbc.gridheight=2;
		gbc.gridwidth=2;
		resume.add(img, gbc);
		gbc.anchor=GridBagConstraints.LINE_START;
		gbc.gridheight=1;
		gbc.gridwidth=1;
		gbc.gridx=1;
		gbc.gridy=2;
		resume.add(titre, gbc);
		gbc.gridy=3;
		resume.add(auteur, gbc);
		gbc.gridy=4;
		resume.add(dessinateur, gbc);
		gbc.gridy=5;
		resume.add(annee, gbc);
		gbc.gridy=6;
		resume.add(genre, gbc);
		gbc.gridy=7;
		resume.add(editeur, gbc);
		gbc.gridy=8;
		resume.add(descript, gbc);
		gbc.anchor=GridBagConstraints.LINE_END;
		gbc.gridy=9;
		//Boutons de bas de page
		gbc.gridx=0;
		gbc.gridwidth=GridBagConstraints.RELATIVE;
		JButton modify=new JButton("Modifier");
		modify.setActionCommand("modify");
		modify.addActionListener(ButtonControler);
		JButton delete=new JButton("Supprimer");
		delete.setActionCommand("delete");
		delete.addActionListener(ButtonControler);
		resume.add(delete, gbc);
		gbc.gridx=1;
		gbc.gridwidth=GridBagConstraints.REMAINDER;
		resume.add(modify, gbc);
		//Integration
		return resume;
	}
	/**
	 * Methode qui permet la mise a jour du Look'n'Feel.
	 * @param choice le LnF Synthetica choisit par l'utilisateur : - 0 Standard, - 1 Classy
	 */
	public void setLNF(int choice){
		switch(choice){
		case 0 : 
			try {
				UIManager.setLookAndFeel(new SyntheticaStandardLookAndFeel());
				if(this.lnfChanged){
					SwingUtilities.updateComponentTreeUI(f);
					f.pack();
				}
				lnfChanged=true;
			} 
			catch (Exception e) {
				System.err.println("Erreur d'affichage LNF Defaut");
			}
			break;
		case 1 :
			try{
				UIManager.setLookAndFeel(new SyntheticaClassyLookAndFeel());
				if(this.lnfChanged){
					SwingUtilities.updateComponentTreeUI(f);
					f.pack();
				}
				lnfChanged=true;
			}
			catch (Exception e){
				System.err.println("Erreur d'affichage LNF Classy");
			}
			break;
		}
	}

	public void updateResume(){
		if(mod.getAlbum()!=null){
			this.annee.setText(mod.getAlbum().getAnnee());
			this.auteur.setText(mod.getAlbum().getAuteurs());
			this.dessinateur.setText(mod.getAlbum().getDessinateurs());
			this.editeur.setText(mod.getAlbum().getEditeur());
			this.genre.setText(mod.getAlbum().getGenres());
			this.titre.setText(mod.getAlbum().getTitre());
			this.descript.setText(mod.getAlbum().getResume());
			this.f.invalidate();
			this.f.repaint();
			this.img.repaint();
			this.img.validate();
			this.descript.setOpaque(false);
		}
	}
	public void update(Observable arg0, Object arg1) {
		if(mod.amEnCours()){
			f.setEnabled(false);
		}else{
			f.setEnabled(true);
		}
		updateResume();
	}
	@SuppressWarnings("static-access")
	public void aPropos(){
		new JOptionPane().showMessageDialog(f, "\nProgramme pense, concu et teste par : \n" +
				"           Coudeville Paul \n " +
				"          Di Cola Florian \n " +
				"          Dusseaux Tom \n \n" +
				"Professeurs tuteurs : \n" +
				"          Mr. Martinet\n" +
				"          Mme. Boneva\n \n" +
				"DUT Informatique \n" +
				"IUT A, Villeneuve d'Asq \n" +
				"Promotion 2013 - 2014 \n \n" +
				"Copyleft GNU - GPL", "A propos...", JOptionPane.INFORMATION_MESSAGE);
	}
}